package persistencia.compartido;

import java.io.File;
import java.util.Iterator;
import java.util.Observable;
import java.util.Observer;
import java.util.Map.Entry;

import compartido.RegistroDeIdentificadores;
import compartido.IEntidad;

import persistencia.IAlmacen;
import persistencia.IGondola;
import persistencia.excepciones.StringDeConexionIncompatible;
import persistencia.xml.AlmacenXML;
import persistencia.xml.EnsambladorXML;
import persistencia.xml.ensambladores.RegistroDeEnsambladoresXML;

public class Repositorio extends Observable {
	protected IAlmacen almacen;

	protected static RegistroDeIdentificadores identificadores = RegistroDeIdentificadores.getInstancia();
	
	protected void registrarEnsambladores() {
		RegistroDeEnsambladoresXML ensambladores = RegistroDeEnsambladoresXML.getInstancia();
		
		for (Entry<Tipo<IEntidad>, EnsambladorXML> tipo_ensamblador : ensambladores)
			almacen.registrarEnsamblador(tipo_ensamblador.getKey(), tipo_ensamblador.getValue());
	}
	
	public Repositorio(String directorioDeTrabajo) {
		File directorio = new File(directorioDeTrabajo);
		if (directorio.isDirectory()) {
			almacen = new AlmacenXML();

			try {
				almacen.abrir("xml:"+directorio.getAbsolutePath());
			} catch (StringDeConexionIncompatible e) {
			}
			
			if (almacen.estaConectado())
				registrarEnsambladores();
		}
	}
	
	public IEntidad obtenerEntidad(Tipo<IEntidad> tipo, String identificador) {
		IEntidad encontrada = null;
		
		if (tipo != null) {
			IGondola gondola = almacen.obtenerGondola(tipo);
			if (gondola != null)
				encontrada = gondola.obtener(identificador);
		}
		
		return encontrada;
	}
	
	public void guardarEntidad(IEntidad entidadAGuardar) {
		if (entidadAGuardar != null) {
			Tipo<IEntidad> tipo = new Tipo<IEntidad>(entidadAGuardar.getClass());
			IGondola gondola = almacen.obtenerGondola(tipo);
			if (gondola == null)
				gondola = almacen.crearGondola(tipo);
			if (gondola != null)
				gondola.agregar(entidadAGuardar);
		}
	}
	
	public void eliminarEntidad(IEntidad entidadAEliminar) {
		if (entidadAEliminar != null) {
			Tipo<IEntidad> tipo = new Tipo<IEntidad>(entidadAEliminar.getClass());
			IGondola gondola = almacen.obtenerGondola(tipo);
			if (gondola != null) 
				gondola.eliminar(entidadAEliminar);
		}
	}

	public Iterable<IEntidad> entidadesDe(Tipo<IEntidad> tipo) {
		IGondola gondola = almacen.obtenerGondola(tipo);
		
		return gondola;
	}
	
	public Iterator<IEntidad> iterarEntidades(Tipo<IEntidad> tipo) {
		IGondola gondola = almacen.obtenerGondola(tipo);
		Iterator<IEntidad> iterador = null;
		if (gondola != null)
			iterador = gondola.iterator();
		
		return iterador;
	}
	
	public void guardar() {
		almacen.guardar();
	}
}
